home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1997 July
/
EnigmA AMIGA RUN 20 (1997)(G.R. Edizioni)(IT)[!][issue 1997-07 & 08][EAR-CD IV].iso
/
earcd
/
docs
/
mags
/
saku21.lha
/
Teksti
/
Eiffel.txt
< prev
next >
Wrap
Text File
|
1997-04-06
|
10KB
|
226 lines
2
1*
{A Eiffel-ohjelmointikieli
{A -----------------------
{8 Mikko Koivunalho
{8 mikkoi@utu.fi
Eiffel on nuori ohjelmointikieli. Sen ensimmäinen malli julkistettiin vuonna
1985. 12 vuotta ei ole pitkä ikä, varsinkaan kun ottaa huomioon, että kieli on
tullut laajemmin tunnetuksi vasta parina viime vuotena. Niinpä Eiffelillä onkin
ollut hyvää aikaa puhdistautua alkuvaiheen virheistä ja suunnitteluvioista. Kui-
tenkin sen määrittelyä on muutettu merkittävästi vain kerran, 1991, ja nykyinen
Eiffel-malli, Eiffel 3, on sittemmin pysynyt muuttamattomana.
Eiffel-standardi on pysynyt samanlaisena, koska Eiffelin kehitys on pääosin yk-
sissä käsissä: Bertrand Meyerin ja ISE:n (Interactive Software Engineering), ja
kielen standardina pidetään Meyerin kirjaa "Eiffel, The Language". Nimensä Eif-
fel on saanut ranskalaiselta insinööriltä Alexander Gustave Eiffeliltä [efe'l]
(1832-1923). Kielen suunnittelussa Meyer on seurannut Eiffelin omaa ideologiaa,
jonka mukaan rakenteiden itsensä (pääosin rautaa, esim. Eiffelin torni) tulee
olla kaunista katseltavaa symmetrisyydessään, yksinkertaisuudessaan ja täsmälli-
syydessään.
Eiffel on uusi kieli, jonka suunnittelussa on tieten tahtoen hylätty suuri jouk-
ko vanhemmissa kielissä käytettäviä ohjelmointimetodeja ja otettu käyttöön uu-
sia. Paitsi että se on täysiverinen oliosuuntautunut kieli, se on myös pikku-
tarkka ja perinteisiin kieliin nähden syntaksiltaan yksinkertainen sekä ohjel-
moijalta runsasta etukäteissuunnittelua vaativa.
{6 ---------->
Eiffelin filosofiaa ymmärtääkseen on tarkasteltava perinteisiä kieliä ja niiden
ongelmia. Jo kauan ennen Eiffeliä ohjelmoinnin metodologian tutkijat esittivät,
että mm. GOTO-komento ei missään nimessä kuulu asialliseen ohjelmointiin, koska
se sallii ohjelman suoritusjärjestyksen täydellisen rikkomisen. Tämä ja vastaa-
vanlaiset piirteet, mm. funktion tai ohjelman keskeytys ennen loppua, on täysin
poistettu Eiffelistä.
Edelleen Eiffelin syntaksia on radikaalisti yksinkertaistettu laittamalla siihen
vain kolme suorituksenohjauslauseketta: yksi ehtolauseke, yksi toistolauseke ja
yksi valintalauseke (moniehto-, C:ssä switch). Perinteisissä kielissähän näitä
on monissa ollut kasapäin, esim. C-kielen while-, do-while- ja for-silmukat.
Miksi laittaa monenlaisia toistolausekkeita sotkemaan ohjelmakoodia, kun kerran
yksi riittää kaikkiin tarpeisiin hiukan sovittamalla?
Eiffel on myös voimakkaasti tyypitetty kieli. Tavanomaisten vanhoista kielistä
tuttujen tyyppien kuten REAL, INTEGER ja BOOLEAN lisäksi siihen on "sisäänraken-
nettu" muita tyyppejä, jotka useimmista kielistä puuttuvat kokonaan tai ne on
toteutettu kielen itsensä ulkopuolella, esim. vektori, lineaarinen lista, pino
ja jono.
{DOliokieli
Edellä kirjoitin "sisäänrakennettu" lainausmerkeissä. Ilmaisu sallittakoon mi-
nulle, vaikka nyt selitänkin, miksi näin ei oikeastaan voi olla: Eiffel on puh-
das oliokieli, joten kaikkien sen ominaisuuksienkin tulee olla olioita.
{6 ---------->
Tietorakenteet eli tietotyypit onkin kaikki toteutettu olioina. Niinpä esimer-
kiksi vektoria tai listaa voi kasvattaa tai kutistaa kulloisenkin olion sisällä
vaivaamatta pääohjelmaa. Muita erikoisia tietotyyppejä ovat mm. puu-tyyppi, jol-
la on aina kaksi oksaa ja yksi juuri, tai graafi, vielä puurakennettakin moni-
puolisempi joukkotyyppi. Edellä mainittuja ja muita tyyppejä voidaan käyttää mm.
erityyppisen tiedon tallennukseen ja helppoon järjestämiseen. Muita tietoraken-
teita voi luoda omaan tarpeeseen omina olioinaan, jotka sitten voi liittää
peräkkäin vaikka vektoriin tai jonoon.
Ohjelmointia helpottaa myös automaattinen roskienkerääjä, joka vapauttaa niiden
olioiden varaaman muistin, joihin ei enää ole osoitinta. Tämä tietysti hidastaa
ohjelman suoritusta hivenen, mutta toisaalta nopeuttaa valtaisasti sen teke-
mistä, koska muistivuotoja ei synny. Niiden paikkailuunhan aikaa eniten tuhraan-
tuu koodattaessa ja virheitä korjattaessa.
{DEiffelin toteutus
Nykyisissä Eiffel-ympäristöissä Eiffel-koodia ei suinkaan käännetä suoraan kone-
kieleen vaan käyttäen välikielenä C:tä.
Varsinainen ISE:n Eiffel on isojen koneiden kieli. Sen päätarkoitus on "program-
ming in large", siis suurten ohjelmistojen ohjelmointi. Niinpä ISE:n oma Eif-
fel-paketti on paljon muutakin kuin vain itse kääntäjä. Se on pääasiassa Unix-
purkeille tarkoitettu megojen kokoinen kokoelma ohjelmoijan työkaluja, valmiita
kirjastoja ja oliokokoelmia mm. graafisen ympäristön luomiseen tai verkkosovel-
lusten ohjelmointiin. ISE:n paketissa on jopa oma kieli, LACE, ACE-tiedostojen
eli perinteisemmin "make"-tiedostojen tekemiseen (siis kääntämisen ja linkityk-
sen määrittelyihin).
{6 ---------->
Sittemmin ISE on alkanut tehdä vastavanlaista pakettia myös PC-yhteensopiviin
(pätkitty, mutta toimiva malli on saatavilla ilmaiseksi Maailmanseitistä, osoit-
teesta http://www.eiffel.com). On myös olemassa ilmainen, GNU-lisenssillä levi-
tettävä SmallEiffel-kääntäjä, jonka sorsakoodit on valmiiksi sovitettu GNU C
-kääntäjiin tusinassa eri laiteympäristössä (ftp://ftp.loria.fr/pub/loria/genie-
log/SmallEiffel). (Kääntyy pienellä sovituksella myös mm. SAS C:llä.)
{6 ---------->
{DEiffelin esimerkki-ohjelmapätkiä
Tärkein kysymys on tietenkin, millaista on Eiffelin ohjelmakoodi. Se, pitääkö
ohjelmoija koodin ulkonäöstä, on vakavampi näkökohta kuin useasti tullaan aja-
telleeksikaan. Koodin, siis siistityn koodin, tulee olla ennen kaikkea helppolu-
kuista, jotta se kelpaisi malliksi. Samalla sen tulisi kertoa kielen rakenteesta
ja sisäisistä ratkaisuista. Ylempänä kerroin hiukan Eiffelin koodaamistyylistä,
mutta mitäpä sanat merkitsisivät ilman konkreettisia esimerkkejä:
{C1. esimerkki: Hello_World.e
{5class HELLO_WORLD
{5 -- Se tutuin ohjelma... Näin merkitään kommentit Eiffelissä!
{5 -- Usein Eiffelillä ohjelmoidessa laitetaan vain yksi luokka
{5 -- yhteen tiedostoon ja kerrotaan kääntäjälle, mikä on juuriluokka,
{5 -- josta suoritus alkaa.
{5creation make -- Millä rutiinilla olio luodaan, jos ei spesifisesti määrätä
{5 -- jotakin toista luontioperaatiota.
{5feature -- Mitä ominaisuuksia luokalla on. Sekä rutiinit että tietoalkiot.
{5 make is
{5 do
{5 io.put_string("Hello World.") -- io-luokka hoitaa io-toiminnot.
{5 end
{5end -- HELLO_WORLD Ohjelman suoritus päättyy juuriluokan luontioperaation
{5 -- suorituksen päättymiseen.
{6 ---------->
{C2. esimerkki: Rutiinit
Vaikkei se välttämätöntä olekaan (siis siihen ei pakoteta), esitetään että ru-
tiineja olisi kahdenlaisia: funktioita ja proseduureja. Funktiot suorittavat
jonkin (lasku)toimituksen ja antavat palautteena sen arvon; proseduurit taas
eivät palauta mitään, mutta tekevät/muuttavat jotakin tai jonkin muistipaikan
arvoa. Ja yksi rutiini tietysti tekee mielellään vain yhden asian. Esimerkki
funktion rakenteesta:
{5nimi(argumentit): TYYPPI is -- otsikko ja palautettavan arvon tyyppi
{5require -- (valinnainen) ehtolauseke argumentin arvon
{5 -- sopivuuden testaamiseksi, esim. arg >= 0
{5local -- esitellään muuttujat
{5 luku: INTEGER
{5do
{5 -- itse rutiini
{5 Result := mikäliearvo -- funktion palauttama arvo
{5end -- rutiini loppuu ja arvo palautetaan kutsujalle
{5 -- vasta end-sanaan tultaessa. rutiinia ei voi
{5 -- keskeyttää.
{6 ---------->
{C3. esimerkki: toistolauseke
Kuten jo aikaisemmin mainittiin, Eiffelissä on perinteisiin kieliin nähden vähän
rakenteita kontrollivuon ohjaukseen, mutta ne ovat monipuolisia. Alla on malli
Eiffelin toistolausekkeesta, loop-lauseesta:
{5from -- from-sanan alle laitetaan toistolauseen alustukseen
{5 -- tarvittava koodi, esim. muuttujien alkuarvot.
{5invariant -- (valinnainen) Ehtolauseke, jonka on oltava voimassa jokaisen
{5 -- kierroksen alussa, jotta silmukka toimisi oikein (erityisen
{5 -- tärkeä ensimmäisellä ja viimeisellä kierroksella)
{5variant -- (valinnainen) on päinvastainen laskutoimitus kuin se mikä
{5 -- suoritetaan jokaisella kierroksella; kokonaislukuarvoinen
{5 -- laskutoimitus, jonka tuloksen täytyy olla positiivinen.
{5 -- Varmistaa, että suorituskertoja on äärellinen määrä.
{5until -- lopetusehto
{5loop
{5 -- Tähän väliin itse silmukka.
{5end
Tuntuiko pitkältä ja hankalalta? Mutta tällaisten juttujen miettiminen etukäteen
tekee kummasti debuggauksesta helpompaa ja nopeampaa. Luulisi, että Meyer olisi
laittanut toistolauseen loppuun vastaavan toiminnon kuin alun from-lause huoleh-
timaan toiston jälkeisistä toimenpiteistä. Olisiko unohtanut vai pitänyt turhan
hankalana?
{6 ---------->
{DKenelle Eiffel?
Hankala kysymys. Helpompi kai olisi vastata päinvastaiseen: Eiffel ei ainakaan
missään nimessä ole perinteisen mallin hakkerin kieli. Eiffel-koodin kanssa ei
voi helposti räpeltää tai oikaista. Ohjelman suunnitteluun täytyy uhrata aikaa.
Toisaalta aikaa ei kannata uhrata pienten sovellusten tekemiseen, mutta ammat-
tiohjelmoijille Eiffel voisi olla mannaa. Apuneuvoineen se soveltuu isojen oh-
jelmien tekemiseen.
Mikään jokapaikan jyrä Eiffel ei ole, mutta ainakin minun suosiostani se kilpai-
lee tasaveroisesti C++:n kanssa (raskaassa sarjassa).